文章同步發表至 Medium
建立的方法也很簡單,按照我們之前所說的,要先擁有一個包含 Geometry
資訊的 Feature
存在,我們才能針對這個區域設定他的 Attribute
。
但是我們要如何製造出一個 Geometry
呢? 以我的情況來說,PostgreSQL 是可以儲存空間資訊的,但我沒有辦法在不使用套件的情快下直接讀取出來,因此最方便快速的方法,就是把在 PostgreSQL 中的資料讀取成 WKT 的格式,再轉換成套件所支援的 Geometry 格式。
在 DotSpatial 中,要製造一個 Polygon 需要使用到其他 Geometry 的型別,其中最基本的就是 Coordinate,也就是 Point。
var wkt = "POLYGON((120.501320843584 23.643673036339,120.501491708153 23.6444211261058,120.501498926896 23.6444147291785,120.501524821969 23.6443917685627,120.501717159325 23.6442212029981,120.501677888785 23.644054697763,120.501579964979 23.6436249183856,120.501320843584 23.643673036339))";
// 把 WKT 字串切割成一組一組的座標
var points = wkt.Replace("POLYGON((", "").Replace("))", "").Split(',');
// 建立成 Coordinate
var coordinates = points.Select(point =>
{
var pointArr = point.Split(' ');
return new Coordinate(Convert.ToDouble(pointArr[0]), Convert.ToDouble(pointArr[1]));
}).ToList();
var polygon = new Polygon(coordinates);
這個方法有個缺點,如果是甜甜圈類型的 Polygon,就會因為 Polygon((),())
的關係,多了一個不能被轉換成座標的部分,如果你的資料包含這種格式要記得另外做處理。
建立一個 Shapefile 的完整程式碼如下:
// 設定 Shapefile 類型
var featureSet = new FeatureSet(FeatureType.Polygon);
// 設定座標系統
featureSet.Projection = ProjectionInfo.FromEpsgCode(4326);
// 設定屬性名稱
featureSet.DataTable.Columns.Add(new System.Data.DataColumn("序號", typeof(int)));
featureSet.DataTable.Columns.Add(new System.Data.DataColumn("名稱", typeof(string)));
// 讀取 WKT 為一個 Polygon
var wkt = "POLYGON((120.501320843584 23.643673036339,120.501491708153 23.6444211261058,120.501498926896 23.6444147291785,120.501524821969 23.6443917685627,120.501717159325 23.6442212029981,120.501677888785 23.644054697763,120.501579964979 23.6436249183856,120.501320843584 23.643673036339))";
var points = wkt.Replace("POLYGON((", "").Replace("))", "").Split(',');
var coordinates = points.Select(point =>
{
var pointArr = point.Split(' ');
return new Coordinate(Convert.ToDouble(pointArr[0]), Convert.ToDouble(pointArr[1]));
}).ToList();
var polygon = new Polygon(coordinates);
// 設定 Feature
var feature = new Feature(polygon);
var iFeature= featureSet.AddFeature(feature);
iFeature.DataRow["序號"] = 1;
iFeature.DataRow["名稱"] = "多邊形測試";
// 儲存
featureSet.SaveAs("newFile.shp", true);
把檔案用 QGIS 開啟的結果: